import logging
from datetime import datetime

from fastapi import APIRouter, Form, UploadFile, File, HTTPException

from core.file_core import uploadFile_to_db
from entity.database.mysql import FileRecord
from utils.base_response import BaseResponse
from utils.createID_tool import ConversationIdGenerator
from utils.uploadoss import  format_file_size, oss_client

file=APIRouter()

@file.post("/upload")
async def uploadFile(message_id: str = Form(...), file: UploadFile = File(...)):
    try:
        # 1. 上传文件到OSS
        # 使用推荐的缩短UUID方案
        file_id = ConversationIdGenerator.generate_short_uuid()

        # 检查ID是否已存在（极低概率冲突处理）
        while await FileRecord.exists(file_id=file_id):
            logging.warning(f"ID冲突: {file_id}，重新生成")
            file_id = ConversationIdGenerator.generate_short_uuid()

        # 上传到OSS
        oss_key, file_url, file_size, oss_bucket = await oss_client.upload_file(file, file_id)

        # 获取文件类型
        file_type = 0 if file.filename.lower().endswith(".doc") else 1

        # 保存文件信息到数据库
        file_record = await FileRecord.create(
            file_id=file_id,
            message_id=message_id,
            file_name=file.filename,  # 注意：数据库字段是file_name，所以这里用file_name
            file_type=file_type,
            url=file_url,  # 文件访问URL
            oss_key=oss_key,  # OSS对象键
            oss_bucket=oss_bucket,  # OSS存储桶名称
            file_size=file_size,
            created_time=datetime.now(),
            update_time=datetime.now()
        )

        # 返回成功响应
        return BaseResponse(
                code=10000,
                msg="文件上传成功",
                data={
                    "fileId": file_id,
                    "filename": file.filename,
                    "filesize": format_file_size(file_size),
                    "fileType": file_type
            }
        )
    except HTTPException as e:
        return BaseResponse(
            code=20000,
            msg=e.detail,
            data=None
        )
    except Exception as e:
        return BaseResponse(
            code=20000,
            msg=f"文件上传失败: {str(e)}",
            data=None
        )

